GET COMFORTABLE DBASE is a programming language that lets you easily manipulate random-access files and databases. Invented by Wayne Ratliff, was published by Ashton-Tate, which sold over a million copies. In 1991, Borland bought Ashton-Tate, so now DBASE is published by Borland. Versions of DBASE The original version of DBASE was called DBASE 2. It ran on the IBM PC and also on computers using the CP/M operating system. Then came an improvement called DBASE 3, then DBASE 3+, then DBASE 4, then DBASE 4 version 1.1, then DBASE 4 version 1.5, then DBASE 4 version 2, then DBASE 5. Those improvements run just on the IBM PC (and clones). Two versions of DBASE 5 are available: one for DOS, the other for Windows. A company called Fox Software invented DBASE versions that run faster, contain extra features, and cost less! Microsoft bought Fox Software, so now Fox's versions are published by Microsoft. Fox's versions of DBASE are called FOXBASE (which resembles DBASE 3), FOXBASE+ (which resembles DBASE 3+), FOXPRO (which resembles DBASE 4), and FOXPRO 2 (which goes beyond DBASE 4), FOXPRO 2.5 (which goes even further), and FOXPRO 2.6 (which goes even further). Two versions of FOXPRO 2.6 are available: one for DOS, the other for Windows. A Mac version of FOXPRO 2.6 isn't available yet, but you can get a Mac version of FOXPRO 2.5. Discount dealers sell each of those versions (FOXPRO 2.6 DOS, FOXPRO 2.6 Windows, and FOXPRO 2.5 Mac) for about $90, though that temporary low price will probably rise. What's in this chapter I'll explain how to use DBASE 4 version 1.5. (Newer versions of DBASE are similar.) I'll also explain the differences in DBASE 3, DBASE 3+, DBASE 4 version 1.1, and FOXPRO 2. (Newer versions of FOXPRO are similar to FOXPRO 2.) Hardware requirements Fancy versions (such as DBASE 4, FOXBASE+, FOXPRO, and FOXPRO 2) require a hard disk. If you lack a hard disk, use DBASE 3 or 3+. DBASE 4 requires 640K of RAM. FOXPRO and FOXPRO 2 require 512K. If you don't have so much RAM, use DBASE 3 or 3+, which require just 384K. To use FOXPRO 2's advanced commands, you need at least 1«M of RAM and either a 386 or 486 CPU. To use FOXPRO 2 easily, you need a mouse. Copy to the hard disk When you buy DBASE 4 version 1.5, you get a big box that contains five manuals, four 1.2M floppies, and five 720K floppies. (If your disk drive needs 360K floppies instead, you can get them by mailing Borland $15 extra.) Here's how to copy DBASE 4 version 1.5 onto your hard disk. (But if you're sharing the computer, ask your colleagues whether they did this step already!) Turn on the computer without any floppy in drive A. When you see the C prompt, put the DBASE Install Disk into drive A. Type ``a:''. You'll see an A prompt. Type ``install''. The computer will say ``DBASE 4 Installation''. Press ENTER twice. The computer will say ``Software Registration''. Type your name and press ENTER. Type your company's name (if any) and press ENTER. Type your serial number, which is on the label of the 5¬-inch DBASE Install Disk. (If you remove that disk from the drive to peek at the serial number, put that disk back in the drive when you finish peeking.) While holding down the Ctrl key, press the END key. The computer will ask, ``Do you wish to install caching?'' To keep the installation procedure simple, press N. When the computer tells you, insert the other DBASE disks, and press ENTER after each insertion. The computer will say, ``DBASE 4 can be run from any directory if your AUTOEXEC.BAT file contains the necessary information.'' To keep your AUTOEXEC.BAT file simple, press the Esc key. The computer will say, ``DBASE 4 will not run properly unless adequate file and buffer space is reserved.'' Press ENTER. The computer will make your CONFIG.SYS file says ``files=99''. The computer will say, ``The installation of DBASE 4 is complete.'' Press ENTER. Turn off the computer so you can start fresh.  Old versions DBASE 3 comes on three 360K disks. The first disk is the program itself; the second disk is a spare copy of the program, in case the first disk gets damaged; the third disk contains examples and utilities. DBASE 3+ comes on seven 360K disks. Two disks contain the program itself, and the other five disks are supplementary. Instead of copying DBASE 3 or 3+ to the hard disk, try using the procedures described in the next section. DBASE 4 version 1.1 comes on ten 360K disks, which you install by using a procedure similar to DBASE version 1.5.  FOXPRO 2 When you buy FOXPRO 2, you get a big box that contains nine manuals and four 1.2M disks. Here's how to copy FOXPRO 2 onto your hard disk. (I assume you have a 386 or 486, at least 1«M of RAM, and a mouse. I assume you've practiced using the mouse with other software, such as Windows or Deluxe Paint.) Turn on the computer without any floppy in drive A. When you see the C prompt, put FOXPRO Disk 1 into drive A. Type ``a:install''. The computer will say, ``Fox Software Product Installation''. Press ENTER 6 times. The computer will say, ``Enter your FOXPRO Serial Number''. Type the Serial Number (which came on a sheet of paper enclosed with the disks). The computer will say, ``Enter your FOXPRO Activation Key''. Type the hidden Activation Key (which is hidden on the SECOND sheet of paper enclosed with the disks; do NOT type the DEMONSTRATION Activation Key). The computer will say, ``Please insert Disk #2''. Insert FOXPRO Disk 2 into drive A, and press ENTER. The computer will say, ``Please insert Disk #3''. Insert FOXPRO Disk 3 into drive A, and press ENTER three times. The computer will say, ``Programs To Install''. Using the mouse, click the ``Check All'' button, then click the ``Install'' button. The computer will say, ``Please insert Disk #4''. Insert FOXPRO Disk 4 into drive A, and press ENTER. The computer will say, ``Installation Complete''. Press ENTER. Turn off the computer so you can start fresh. Start DBASE To start using DBASE 4, turn on the computer without any floppy in drive A. If you've put the DO.BAT file onto your hard disk (as I recommended in the MS-DOS chapter), type ``do dbase''. If you have not put DO.BAT onto your hard disk, you must type ``cd dbase'' and then ``dbase''. (If you're using DBASE 4 version 1.0 or 1.1, the computer will say ``This software is licensed''. Press ENTER.) The computer will say ``DBASE 4 CONTROL CENTER''. Press the Esc key. The computer will ask, ``Are you sure?'' Press the Y key. At the screen's lower left corner, you'll see a period, which is called the dot prompt. After the dot prompt, you can type any DBASE command you wish. Press the CAPS LOCK key, so any commands you type will be capitalized.  Old versions Here's how to start using DBASE 3 and 3+. Without putting any DBASE floppies into the drives, turn on the computer. Wait for a DOS prompt to appear. Put DBASE System Disk 1 in drive A. Make sure you see an A prompt. (If you're using a hard disk, do that by typing ``a:'' after the C prompt.) Peculiarity: if you're using DBASE 3+ version 1.1 and nobody's ever used your System Disk 1 before, you must give it an ``ID'' by following the instructions in the ``Getting Started'' booklet that came with the disk. Regardless of which version of DBASE 3+ you're using, your next step is to type ``dbase'' after the A prompt. If the bottom of the screen says ``Press ENTER to assent to the License Agreement'', press ENTER. If the computer says ``Insert System Disk 2'', do so and press ENTER. If the bottom right corner of the screen says ``Exit ___ Esc'', press the Esc key. At the screen's lower left corner, you'll see a period, which is the dot prompt. Press the CAPS LOCK key, so any commands you type will be capitalized. If you have a hard disk, type ``SET DEFAULT TO C''. If you lack a hard disk, put a blank formatted disk in drive B and type ``SET DEFAULT TO B''.  FOXPRO 2 Here's how to start using FOXPRO 2. Turn on the computer without any floppy in drive A. When you see the C prompt, type ``cd foxpro2''. When you see the FOXPRO2 prompt, type ``foxprox''. (If you don't have enough RAM to run ``foxprox'', type ``fox'' instead.) In the middle of the screen, you'll see a rectangle that has the word ``Command'' at the top of it. That rectangle is called the ``Command Window''. To move that rectangle to a different part of the screen, use the mouse: point at the word ``Command'', and drag it. To change the rectangle's size, point at the dot in the rectangle's bottom right corner, and drag it. For best results, drag until the rectangle consumes most of the top third of the screen. Press the CAPS LOCK key, so any commands you type will be capitalized. Arithmetic If you want the computer to print the answer to 5+2, say ``? 5+2'' after the dot prompt, so your screen looks like this: . ? 5+2 The computer will print: 7 Notice that DBASE, like BASIC, uses a question mark to mean print. So ``? 5+2'' means: print 5+2. In DBASE, you must use the question mark; do not type the word PRINT. DBASE, like BASIC, uses the symbols +, -, *, /, ^, E, and parentheses. Unfortunately, DBASE gives the wrong answer to -5^2. According to mathematicians, -5^2 means ``the negative of 5^2'', which is ``the negative of 25'', which is -25. DBASE mistakenly thinks that -5^2 means ``the square of -5'' and therefore prints 25.  FOXPRO 2 You don't see a dot prompt. Just type: ? 5+2 Your typing will appear in the Command Window. At the end of your typing, when you press the ENTER key, the computer will print this answer at the screen's bottom: 7 Strings DBASE, like BASIC, lets you use quotation marks to create strings. So if you say ___ . ? "I LOVE YOU" the computer will print: I LOVE YOU Multiple computations You can print several computations on the same line. For example, if you say ___ . ? 2+3,2-3,2*3,2/3 the computer will print: 5 -1 6 0.67 QUIT When you finish using DBASE, do not turn off the computer's power. Turning off the power will wreck the data files you've been working on. Instead of turning off the power, say QUIT, so your screen looks like this: . QUIT That QUIT command makes the computer put the finishing touches on all your data files. Then the computer will stop using DBASE, and will say: C:\> After the ``C:\>'', you can give any DOS command, or turn off the power. CREATE A DATA FILE Let's create a data file about families in your neighborhood. Begin by saying: . CREATE FAMILIES That makes the computer create, on your disk, a data file named ``FAMILIES.DBF''. (The ``.DBF'' stands for ``Data Base File''.) Complete the chart Let's store each family's NAME, annual INCOME, and POPULATION (number of people in the family). Suppose the longest family NAME is Anagnostopoulos, the highest INCOME is 125000.00, and the largest POPULATION is 13 (because the family includes a mother, father, and 11 kids). To prepare the computer to handle such data, feed the computer this chart: ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄ¿ ³ Num ³ Field Name ³ Field Type ³ Width ³ Dec ³ Index ³ ÆÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍÍ͵ ³ 1 ³ NAME ³ Character ³ 15 ³ ³ N ³ ³ 2 ³ INCOME ³ Numeric ³ 9 ³ 2 ³ N ³ ³ 3 ³ POPULATION ³ Numeric ³ 2 ³ 0 ³ N ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÙ The second column says that for each family we're storing these fields: the family's NAME, INCOME, and POPULATION. The left column numbers those fields: 1, 2, and 3. The third column says that each family's NAME is a string of characters, and that each family's INCOME and POPULATION are numbers. The remaining columns say that each NAME can be up to 15 characters long (such as ``Anagnostopoulos''), each INCOME can be up to 9 symbols long (such as 125000.00) and has 2 digits after the decimal point, each POPULATION can be up to 2 digits long (such as 13) and has no decimals, and No field is indexed. As soon as you say CREATE FAMILIES (and press the ENTER key at the end of that line), the computer asks you to feed it that chart. To help you start, the computer puts this on the screen: ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄ¿ ³ Num ³ Field Name ³ Field Type ³ Width ³ Dec ³ Index ³ ÆÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍÍ͵ ³ 1 ³ ³ Character ³ ³ ³ N ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÙ Just fill in all the other entries in the chart ___ and press the ENTER key after each entry. Here are the details. . . . Begin by typing NAME (by pressing the N key, then A, then M, then E). Press the ENTER key at the end of that entry. Since the computer's already typed the next entry for you (Character), press the ENTER key again. Type the next entry (15). Press ENTER. Since the computer's already typed the next entry for you (N), press the ENTER key again. Type the next entry (INCOME). Press ENTER. Start typing the next entry (Numeric). As soon as you type the N of Numeric, the computer automatically types the ``umeric'' for you and presses the ENTER key for you. Type the next entry (9); press ENTER. Type the next entry (2); press ENTER. Accept the N, by pressing ENTER again. Type the next entry (POPULATION). Since POPULATION is so long, when you finish typing it the computer will automatically beep (to warn you not to make it even longer!) and press ENTER for you. Type the next entry (N) and the next entry (2); press ENTER. Type the final entry (0). Since you've finished typing the entire table, tap the END key while holding down the CONTROL key.  Old versions DBASE 3 and 3+ omit the Num and Index columns. DBASE 3 says Char/text instead of Character. When you tap the END key wwhile holding down the CONTROL key, DBASE 3+ says ``Press ENTER to confirm''; DBASE 3 says ``Hit RETURN to confirm''; obey those versions by pressing the ENTER/RETURN key.  FOXPRO 2 Feed the computer this chart: Name Type Width Dec ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³NAME Character 15 ³ ³INCOME Numeric 9 2³ ³POPULATION Numeric 2 0³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Begin by typing NAME. Press the TAB key at the end of that entry. Since the computer's already typed the next entry for you (Character), press the TAB key again. Type the next entry (15). Press TAB. Type the next entry (INCOME). Press TAB. Start typing the next entry (Numeric). As soon as you type the N of Numeric, the computer automatically types the ``umeric'' for you and presses the TAB key for you. Type the next entry (9); press TAB. Type the next entry (2); press TAB. Type the next entry (POPULATION); press TAB. Type the next entry (N) and the next entry (2). The computer will automatically type the final 0. Using the mouse, click the word ``OK''. Input the data The computer will ask: Input data records now? (Y/N) Tap the Y key, which means Yes. On the screen, you'll see this: NAME INCOME . POPULATION Notice that the NAME box is wide enough to hold 15 characters, the INCOME box already includes the decimal point, and the POPULATION box is wide enough to hold a 2-digit number. Fill in the boxes. Here's how. Type the first family's name (SMITH). As you type SMITH, you'll see it appear in the first box. When you finish typing SMITH, press ENTER. Type family's income (24100.19). As you type 24100.19, you'll see it appear in the second box. When you type the decimal point, the number will automatically slide toward the right edge of the box, so that the decimal point you typed is at the same place as the decimal point that was already in the box. When you finish typing the number, the computer will automatically beep and move you to the third box. Type the family's population (4). You'll see it appear in the third box. When you press the ENTER key afterwards, the computer will record what you typed. Then the boxes will become blank again, so that you can enter a second family's data. After entering the second family's data (and pressing the ENTER key if necessary), the screen will go blank again, so you can enter a third family's data. Enter data for as many families as you wish. When you've typed the data for the last family, and you're still looking at that data on the screen, tap the END key while holding down the CONTROL key. The computer will display the dot prompt, so that you can give another DBASE command.  FOXPRO 2 When you finish typing an entry (such as SMITH), you can press either the ENTER key or the TAB key. In a numeric field (such as INCOME), you don't see the decimal point until you type it. When you finish typing the first family's data, that data does NOT disappear from the screen; instead, the computer lets you type the second family's data underneath the first family's. When you finish typing the last family's data, click the close box (which is the yellow square in the window's top left corner). SEE YOUR DATA After you've created a data file, you can say: . LIST That makes the computer list your file's information onto the screen, so the screen will look like this: Record# NAME INCOME POPULATION 1 SMITH 24100.19 4 2 ANAGNOSTOPOULOS 65143.26 5 3 SANCHEZ 50000.00 13 4 JONES 9873.00 2 5 SZCZEPANKIEWICZ 125000.00 4 6 SANTINI -4130.15 4 7 WONG 15691.18 3 Notice that the Sanchez family has a high income (50000.00) but must split it among 13 people (mother, father, and 11 kids). The Jones family's population is just 2: a single mother and her baby. The Santini family's income is a negative number this year, because the family invested big money in the stock market and lost. Choose your columns You can make the computer omit some of the columns. If you say ___ . LIST NAME,POPULATION the computer will list the NAME and POPULATION columns but not the INCOME column; it will list this: Record# NAME POPULATION 1 SMITH 4 2 ANAGNOSTOPOULOS 5 3 SANCHEZ 13 4 JONES 2 5 SZCZEPANKIEWICZ 4 6 SANTINI 4 7 WONG 3 If you say ___ . LIST POPULATION,NAME the computer will list the POPULATION column before the NAME column, like this: Record# POPULATION NAME 1 4 SMITH 2 5 ANAGNOSTOPOULOS 3 13 SANCHEZ 4 2 JONES 5 4 SZCZEPANKIEWICZ 6 4 SANTINI 7 3 WONG If you say ___ . LIST OFF POPULATION,NAME the computer will turn off the ``Record#'' column; it will list just this: POPULATION NAME 4 SMITH 5 ANAGNOSTOPOULOS 13 SANCHEZ 2 JONES 4 SZCZEPANKIEWICZ 4 SANTINI 3 WONG For each family, let's compute the income per person. To do that, divide the family's income by the family's population. To display the income per person, and everything else, say ___ . LIST NAME,INCOME,POPULATION,INCOME/POPULATION The computer will list this: Record# NAME INCOME POPULATION INCOME/POPULATION 1 SMITH 24100.19 4 6025.05 2 ANAGNOSTOPOULOS 65143.26 5 13028.65 3 SANCHEZ 50000.00 13 3846.15 4 JONES 9873.00 2 4936.50 5 SZCZEPANKIEWICZ 125000.00 4 31250.00 6 SANTINI -4130.15 4 -1032.54 7 WONG 15691.18 3 5230.39 LIST FOR To list just the low-income families (earning under $10,000), say: . LIST FOR INCOME<10000 The computer will list: Record# NAME INCOME POPULATION 4 JONES 9873.00 2 6 SANTINI -4130.15 4 To list just the high-income families (earning at least $50,000), say: . LIST FOR INCOME>=50000 That means: list for INCOME greater than or equal to $50,000. When you're comparing strings, an equal sign means ``begins with''. So to list every family whose NAME begins with ``SAN'', say: . LIST FOR NAME="SAN" The computer will list all data about SANCHEZ and SANTINI. To list every family whose NAME does not begin with ``SAN'', say ___ . LIST FOR NAME<>"SAN" or, if you prefer, say: . LIST FOR NAME#"SAN" To list just the ``SAN'' families whose incomes are high, say: . LIST FOR NAME="SAN" .AND. INCOME>=50000 That makes the computer list the data for SANCHEZ (whose income is 50000) but not SANTINI (whose income is -4130.15). Notice you must put periods around the word AND. DBASE also understands the word OR, which you must surround with periods. If you want to change DBASE, so that an equal sign between strings means ``exactly equals'' instead of ``begins with'', say: . SET EXACT ON The SET EXACT ON command remains in effect until you say QUIT or SET EXACT OFF.  FOXPRO 2 You can omit the periods around AND and OR. For example, you can say either ``.AND.'' or ``AND''; the computer doesn't care. LIST STRUCTURE If you say ___ . LIST STRUCTURE the computer will say: Field Field name Type Width Dec Index 1 NAME Character 15 N 2 INCOME Numeric 9 2 N 3 POPULATION Numeric 2 N ** Total ** 27 The computer will also say that the file contains 7 records, and it will say the date the file was last changed. Compute the statistics The computer can do statistics. COUNT If you say ___ . COUNT the computer will count how many records are in the file. It will say: 7 records SUM If you say ___ . SUM the computer will sum all the numbers in the file. It will say: 7 records summed INCOME POPULATION 285677.48 35 That means: the sum of all the incomes is $285,677.48, and the sum of all the populations is 35. So altogether, your entire neighborhood earns a total of $285,677.48, and the neighborhood's total population is 35. AVERAGE If you say ___ . AVERAGE the computer will average all the numbers in the file. It will say: 7 records averaged INCOME POPULATION 40811.07 5 That means the average family INCOME is $40,811.07, and the average family POPULATION is 5. (The average family population would be much lower if the Sanchez family didn't have 13 members.) Restrictions After the word COUNT, SUM, or AVERAGE, you can add restrictions. For example, if you want to find the average of just the SANCHEZ and SANTINI families, say: . AVERAGE FOR NAME="SAN" The computer will say: 2 records averaged INCOME POPULATION 22934.93 8.50 If you want to average just the incomes, and don't want to bother averaging the populations, say: . AVERAGE INCOME FOR NAME="SAN"  Old versions When you say AVERAGE FOR NAME=``SAN'', the average population is exactly 8.5, but DBASE 3 and 3+ make the computer shorten the answer and say just 8.  FOXPRO 2 When you say AVERAGE FOR NAME=``SAN'', the average population is exactly 8.5, but the computer rounds the answer and says 9. Print on paper To print on paper, you can use several tricks. The simplest is to tap the PRINT SCREEN key. (If your keyboard doesn't have a PRINT SCREEN key, press the PrtSc key while holding down the SHIFT key.) That makes the printer print a snapshot of what's on the screen. Another way is to type: . SET PRINT ON Afterwards, anything that will appear on the screen will also appear on paper simultaneously. The SET PRINT ON command remains in effect until you say SET PRINT OFF. To LIST on paper, you can say: . SET PRINT ON . LIST . SET PRINT OFF A faster way to LIST onto paper is to say: . LIST TO PRINT  Old versions If you say LIST TO PRINT while using DBASE 3+, the last line of the listing gets temporarily lost, in a part of RAM called the ``buffer''. That last line won't get transferred to paper until afterwards, when you give your next print-to-paper command, or when you say SET PRINT ON.  FOXPRO 2 If you say SET PRINT ON, anything that will appear on the screen's bottom line will appear on paper simultaneously. (Saying SET PRINT ON will NOT make the paper show what's in the Command Window.) Interrupt the computer If the computer is doing something you don't like, and you want to stop the computer, press the ESCAPE key (which says ``Esc'' on it). That makes the computer abort what it was doing. For example, suppose you say LIST, and the computer starts printing a long listing. If you get impatient and don't want to see the rest of the listing, press the ESCAPE key. In some situations, when you press the ESCAPE key, the computer asks: Cancel Ignore Suspend Confirm that you want to cancel: press the C key. After the computer aborts, it displays the dot prompt, so you can give another DBASE command. In DBASE, as in IBM's BASIC and PC-DOS, you can make the computer pause by pressing the PAUSE key. (If your keyboard doesn't have a PAUSE key, tap the NUM LOCK key while holding down the CONTROL key.) To make the computer continue where it left off, press the SPACE bar. If you say DISPLAY ALL instead of LIST, the computer will list the file but will automatically pause at the end of each screenful. At the end of each screenful, it will say, ``Press any key to continue''. When you press ENTER, the computer will continue on to the next screenful. Short-cut: instead of saying DISPLAY ALL FOR NAME=``SAN'', you can say DISPLAY FOR NAME=``SAN''. Here's the rule: before the word FOR, you can omit ALL.  Old versions Instead of saying ``Cancel Ignore Suspend'', DBASE 3+ says ``Cancel, Ignore, or Suspend? (C, I, or S)''; DBASE 3 says ``Terminate command file?'', to which you respond by tapping the Y key. Grab a particular record To list just the 3rd record say: . LIST RECORD 3 The computer will say: Record# NAME INCOME POPULATION 3 SANCHEZ 50000.00 13 Instead of saying LIST RECORD 3, you can say: . GO 3 . DISPLAY That makes the computer GO to record #3 and DISPLAY it. That pair of lines (GO 3 and DISPLAY) has exactly the same effect as saying LIST RECORD 3. After you've gotten the record, you can use that record's NAME, INCOME, and POPULATION for further computations. For example, if you say ___ . ? INCOME/20 the computer will print that record's INCOME divided by 20, which is: 2500 To go to record #1, which is the top record, you can say either GO 1 or GO TOP. If your file contains 7 records, and you want to go to record #7, which is the bottom record, you can say either GO 7 or GO BOTTOM. (After giving a GO command, remember to say DISPLAY.) If you're lazy, you can usually omit the word GO. Instead of saying ___ . GO 3 you can say just: . 3 But you cannot omit the GO from ``GO TOP'' and ``GO BOTTOM''. SKIP SKIP means ``go to the next record''. For example, suppose you've been looking at record #3 (because you said GO 3 and DISPLAY), and you want to go to the next record, which is record #4. Just say: . SKIP . DISPLAY If you say SKIP 2, the computer will skip ahead 2 records. For example, if you've been looking at record #4 and then say SKIP 2, the computer will go to record #6. If you say SKIP -1, the computer will skip back to the previous record. For example, if you've been looking at record #6 and then say SKIP -1, the computer will go back to record #5. LOCATE If you say ___ . LOCATE FOR NAME="SAN" . DISPLAY the computer will start at the first record, and keep hunting until it finds a record whose NAME begins with ``SAN''. Then it will DISPLAY that record: Record# NAME INCOME POPULATION 3 SANCHEZ 50000.00 13 To find the next ``SAN'', say: . CONTINUE . DISPLAY The computer will display: Record# NAME INCOME POPULATION 6 SANTINI -4130.15 13 If you say CONTINUE again, the computer will continue hunting for SAN's. If the computer reaches the end of the file and still hasn't found another SAN, it will give up, and say: End of LOCATE scope  Old versions DBASE 3 and 3+ say just ``End of LOCATE''; they omit the word ``scope''. Attach fancy restrictions If you say: . GO 3 . DISPLAY the computer will display just the 3rd record. If you say ___ . GO 3 . DISPLAY NEXT 2 the computer will display 2 records (the 3rd and the 4th). If you say ___ . GO 3 . DISPLAY NEXT 4 the computer will display 4 records (the 3rd, 4th, 5th, and 6th). If you say ___ . GO 3 . DISPLAY REST the computer will display the 3rd record and all the records that come after it. For example, if the data file contains 7 records, the computer will display the 3rd, 4th, 5th, 6th, and 7th records. (If your data file is long, the computer will pause at the end of each screenful, and wait for you to tell it to continue. If you don't want such pauses, say LIST instead of DISPLAY.) If you say ___ . GO 3 . DISPLAY WHILE INCOME<100000 the computer will start with the 3rd record, and continue displaying records as long as INCOME <100000. Here are the details. . . . The computer starts with the 3rd record, sees that its INCOME is less than 100000, and displays that record. Then the computer checks the 4th record, sees its INCOME is less than 100000, and displays that record. Then the computer checks the 5th record, sees its INCOME is not less than 100000, and refuses to display the 5th record. The computer stops there, and refuses to look at any more records. so the only records it displays are the 3rd and 4th. Those four commands ___ DISPLAY and DISPLAY NEXT and DISPLAY REST and DISPLAY WHILE ___ are all affected by where you said to GO. Three different commands ___ DISPLAY ALL and DISPLAY RECORD and DISPLAY FOR ___ are unaffected by GO. Even if you said GO 3, a DISPLAY ALL will display the entire file, DISPLAY RECORD 2 will display record #2, and DISPLAY FOR INCOME<100000 will display all the records whose INCOMEs are less than 100000. The words NEXT, REST, WHILE, ALL, RECORD, and FOR are called restrictions. You can attach a restriction to any DBASE command that scans data records. For example, you can add a restriction to DISPLAY, LIST, COUNT, SUM, AVERAGE, and LOCATE.  Old versions DBASE 3 doesn't understand the word REST. REVISE YOUR DATA To revise your data, you can say EDIT, BROWSE, REPLACE, APPEND, INSERT, DELETE, or ZAP. EDIT To edit record #3, say ___ . EDIT RECORD 3 or say ___ . EDIT 3 or say: . GO 3 . EDIT The computer will display the 3rd record on the screen and let you edit it. While you edit, you can use the four arrow keys (to move around the screen), the BACKSPACE key (to erase the previous character), the DELETE key (to delete the current character), and the INSERT key (to switch from ``replacing'' to ``inserting'' and back to ``replacing'' again). DBASE handles those keys the same way as good word processors (such as Word Perfect, Q&A's word processor, and DOS 5's EDIT). To erase all the data in a field, just move to that field (by using the arrow keys); then tap the Y key while holding down the CONTROL key. After editing the 3rd record, if you press the PAGE DOWN key, the computer will let you edit the 4th record. If you press the PAGE DOWN key again, the computer will let you edit the 5th record. (Exception: if a record is too long to fit on the screen, pressing the PAGE DOWN key will get you to the next screenful of the same record.) By pressing the PAGE UP key, you can return to earlier records. For example, if you've been editing the 5th record and then press the PAGE UP key, the computer will let you re-edit the 4th record. When you've finished editing all the records you wish, tap the END key while holding down the CONTROL key. Then the computer will display the dot prompt, so you can type another DBASE command.  FOXPRO 2 While you're editing the 3rd record, the screen also shows the 4th and 5th records. When you finishing editing the 3rd record, you can move to the 4th record by either pressing the PAGE DOWN key once or by pressing the down-arrow key several times. When you finish editing all the records you wish, you can either press CONTROL with END or click the close box (the yellow square in the window's top left corner). BROWSE To see several records on the screen simultaneously, so you can edit them all at once, say: . GO 1 . BROWSE That makes the computer LIST the first several records in your file. The computer will let you use the arrow keys to move through the list and edit your data. To hop right to the next field, press the TAB key; to hop left to the previous field, press the TAB key while holding down the SHIFT key. The computer will list as many records as can fit on the screen; to see the next screenful of records, press the PAGE DOWN key. The computer will list as many fields as can fit across the screen; to see other fields, tap the right-arrow key while holding down the CONTROL key. When you've finished editing the data, tap the END key while holding down the CONTROL key.  Old versions In DBASE 3 and 3+, the TAB key doesn't work. Instead, hop to the next field by pressing END; hop back to the previous field by pressing HOME.  FOXPRO 2 The computer will list as many fields as fit across the window. To see other fields, press the TAB key several times. The computer will list as many records as fit in the window. To see other records, press the PAGE DOWN key once or twice (or press the down-arrow key several times). When you've finished editing the data, click the close box (or press CONTROL with END). REPLACE A more literary way to edit records is to type a sentence that begins with the word REPLACE. For example, to change record #3's INCOME to $60,000, say: . GO 3 . REPLACE INCOME WITH 60000 To increase record #5's INCOME by $700, say: . GO 5 . REPLACE INCOME WITH INCOME+700 To increase everybody's INCOME by $700, say: . REPLACE ALL INCOME WITH INCOME+700 To increase the INCOME of just families whose NAME begins with ``SAN'', say: . REPLACE FOR NAME="SAN" INCOME WITH INCOME+700 APPEND To add extra records, say: . APPEND The computer will display a blank record on the screen, and let you fill it in. For example, if your data file contains 7 records, and you say APPEND, the computer will let you type record #8. When you finish typing it (and press the ENTER key at the end of the last field), the computer will let you type record #9, then record #10, etc. When you've finished typing all the records you want to add, tap the END key while holding down the CONTROL key. Then the computer will display the dot prompt, so you can type another DBASE command.  FOXPRO 2 When you've finished typing all the records you want to add, click the close box (or press CONTROL with END). INSERT To insert an extra record between record #3 and record #4, say: . GO 3 . INSERT The computer will display a blank record on your screen, and let you fill it in. When you finish filling it in, tap the END key while holding down the CONTROL key. The new record that you typed will become record #4; the old record #4 will become record #5; the old record #5 will become record #6; etc. The computer will then display the dot prompt, so you can type another DBASE command.  FOXPRO 2 When you finish filling in the record, click the close box (or press CONTROL with END). DELETE To delete records 3, 5, and 6, say: . DELETE RECORD 3 . DELETE RECORD 5 . DELETE RECORD 6 . PACK Here's why. When you give the DELETE commands, the computer makes notes about which records you want to delete. But it doesn't actually delete those records, until you say PACK. When you say PACK, the computer finally deletes those records. It also renumbers all the other records, to fill the gaps left by the records you deleted. Renumbering all the records takes a long time; so while the computer's doing a PACK, you should take your coffee break or lunch break. If you don't want to take a break yet, delay saying PACK until later. Say PACK at the end of the day, or when it's time to QUIT or to switch to a different file. DELETE without PACK If you say to DELETE some records, but you haven't said PACK yet, what happens when you try to LIST the file? The listing will show an asterisk next to each record you said to delete. The asterisked records will disappear later, when you say PACK. If you say ___ . SET DELETED ON the computer hides the asterisked records, so they don't appear in listings and don't affect the COUNT or SUM or AVERAGE. But although the asterisked records are hidden, they're still in the file, until you say PACK. SET DELETED ON remains in effect until you say QUIT or SET DELETED OFF. RECALL If you say DELETE RECORD 3 and then change your mind, you can get the record back by saying RECALL RECORD 3. But RECALL works only if you haven't said PACK yet. Short cuts Instead of saying DELETE RECORD 3, you can say: . GO 3 . DELETE Here's another way to delete record 3: get that record onto your screen (by saying EDIT or BROWSE, and playing with the PAGE UP and PAGE DOWN keys); and while you're looking at that record, tap the U key while holding down the CONTROL key. (The U stands for Undo.) To delete everybody whose name begins with ``SAN'', say: . DELETE FOR NAME="SAN" . PACK ZAP To delete all the records, instead of saying DELETE ALL and PACK, just say: . ZAP Then the computer asks whether you're sure; tap the Y key. Then the computer ZAPs the file, so that all the records are gone. But the computer will still remember how wide you wanted each field, so you can add new records without having to say CREATE. SWITCH FILES You can switch to a different file. Here's how. . . . USE Suppose you create a DBASE file called FAMILIES.DBF, then create a DBASE file called FOODS.DBF. If you say LIST, the computer will assume you want to list the newest file (FOODS.DBF). If you want to list FAMILIES.DBF instead, say: . USE FAMILIES . LIST Saying USE FAMILIES makes the computer switch its attention to FAMILIES.DBF, so that any future command you give (such as LIST or GO or DISPLAY) applies to FAMILIES.DBF. To switch to FOODS.DBF again, say USE FOODS. If you QUIT using DBASE but return to DBASE later, the computer forgets which file you were using. Before saying LIST, say USE FAMILIES or USE FOODS. DIR To see a directory of all the files in your hard disk's DBASE folder, say: . DIR *.* To see a special directory of just your DBASE data files (which end in .DBF), say just: . DIR That makes the computer print a special directory showing each data file's name, how many records it contains, how many bytes it contains, and the date it was last changed. COPY Suppose you're using the FAMILIES.DBF file, and want to make a backup copy of it. If you want the backup copy to be called FRED.DBF, say: . COPY TO FRED That makes FRED.DBF be an exact copy of the whole file. If you want FRED.DBF to include just the records of families whose names begin with ``SAN'', say: . COPY TO FRED FOR NAME="SAN" If you want FRED.DBF to include every family's NAME and POPULATION but not the INCOME, say: . COPY TO FRED FIELDS NAME,POPULATION If you want FRED.DBF to include no records at all, but just have the same structure (the same lengths for all the fields), say: . COPY STRUCTURE TO FRED If you want FRED.DBF to contain all the records, but rearranged so that the NAMEs are in alphabetical order, say ___ . SORT ON NAME TO FRED If you want FRED.DBF to contain all the records, but rearranged so that the INCOMEs are in increasing order, say ___ . SORT ON INCOME TO FRED If you want FRED.DBF to contain all the records, but rearranged so that the INCOMEs are in decreasing order (from the largest to the smallest), say ___ . SORT ON INCOME/D TO FRED ERASE If you ever want to erase FAMILIES.DBF, say: . ERASE FAMILIES.DBF  Hassle While you're in the middle of using FAMILIES.DBF, the computer will refuse to erase it. To stop using it (so you can erase it), tell the computer to use a different file instead (by giving a command such as USE FOODS), or just say ___ .USE which makes the computer use no file at all. Then you can say ERASE FAMILIES.DBF. MODIFY STRUCTURE When you said CREATE, you filled in a chart: for each field you chose a name (such as INCOME), type (such as Numeric), and width (such as 9). If you later want to modify that chart, say: . MODIFY STRUCTURE The screen will again show the chart that you created. By using the arrow keys, you can move through the chart and modify it. You can change a field's name, type, width, or number of decimal places. To delete a field altogether, move to that field, then tap the U key while holding down the CONTROL key. (The U stands for Undo.) To insert an extra field, move to where you want the field to be, then tap the N key while holding down the CONTROL key. (The N stands for iNsert New.) Change as many fields as you like. When you've finished modifying the chart, tap the END key while holding down the CONTROL key. If the computer asks ``Should data be COPIED from backup for all fields?'', tap the Y key. The computer will ask, ``Are you sure you want to save these changes?'' Tap the Y key. The computer will revise your entire data file, so that the file matches the chart. For example, if you said to make a field wider, the computer will do so by adding extra spaces to your data; if you said to make a field narrower, the computer will do so by abridging your data. To see what the computer did to your data file, say LIST.  Hassle If you make the computer change names of fields, the computer can't reliably change anything else at the same time. So to make lots of changes, say MODIFY STRUCTURE and change names of fields; afterwards say MODIFY STRUCTURE again and make all the other changes you wish (widths, decimal places, types, deleted fields, and extra fields).  Old versions After giving the MODIFY STRUCTURE command, DBASE 3 and 3+ make your disk contain two versions of your data file. For example, if you've been dealing with FAMILIES.DBF, your disk will contain a file called FAMILIES.DBF (which is the new, modified version), and your disk will also contain a file called FAMILIES.BAK (which is the previous unmodified version). FAMILIES.BAK is called the backup: use it only if you accidentally made a mistake when giving the MODIFY STRUCTURE command. To use FAMILIES.BAK, say: . USE . ERASE FAMILIES.DBF . RENAME FAMILIES.BAK TO FAMILIES.DBF . USE FAMILIES  FOXPRO 2 To move through the chart quickly, use the mouse: click the part of the chart that interests you. To delete a field altogether, click that field then click the word ``Delete''. To insert an extra field, click where you want the field to be then click the word ``Insert''. When you finish modifying the chart, click the word ``OK'' then click the word ``Yes''. Like DBASE 3 and 3+, FOXPRO 2 creates a .BAK file; for details, read the paragraph above (entitled ``Old versions''). INDEX FILES Suppose you're using a file called FAMILIES.DBF. Let's play a trick, so that every time you say LIST or DISPLAY the NAMEs will appear in alphabetical order, to help you find a particular NAME very quickly. Say: . INDEX ON NAME TO FAMNAME That makes the computer create a file called FAMNAME.NDX, which is an iNDeX file that helps the computer find each family's NAME. Then if you say LIST, the computer will list the families in alphabetical order: Record# NAME INCOME POPULATION 2 ANAGNOSTOPOULOS 65143.26 5 4 JONES 9873.00 2 3 SANCHEZ 50000.00 13 6 SANTINI -4130.15 4 1 SMITH 24100.19 4 5 SZCZEPANKIEWICZ 125000.00 4 7 WONG 15691.18 3 In that file, the TOP is record #2: ANAGNOSTOPOULOS. So if you say ___ . GO TOP . DISPLAY the computer will display: Record# NAME INCOME POPULATION 2 ANAGNOSTOPOULOS 65143.26 5 Then if you say ___ . SKIP . DISPLAY the computer will skip the next record in the alphabetized list, and display: Record# NAME INCOME POPULATION 4 JONES 9873.00 2 In that alphabetized file, saying GO TOP has a different effect from saying GO 1. If you say GO TOP, you're going to the TOP record, which is ANAGNOSTOPOULOS; if you say GO 1, you're going to the record #1, which is SMITH. If you want to add more records to the alphabetized list, say APPEND. As you type the extra records, the computer will automatically update the index file, so when you say LIST you'll see the entire data file ___ including even the new records ___ in alphabetical order.  FOXPRO 2 When you say INDEX ON NAME TO FAMNAME, FOXPRO 2 creates an index file called FAMNAME.IDX (instead of FAMNAME.NDX). How to find To display the first record whose NAME begins with SAN, you can say: . LOCATE FOR NAME="SAN" . DISPLAY To find that record faster, say this instead ___ . SEEK "SAN" . DISPLAY or say: . FIND SAN . DISPLAY The only difference between SEEK and FIND is that SEEK must be followed by quotation marks (or a variable), whereas FIND lets you omit the quotation marks. SEEK and FIND tell the computer to find the record immediately, by using the index file. By contrast, the word LOCATE makes the computer locate the record slowly, by searching through all the records in the whole data file, from beginning to end. If your data file is very long, you'll have to wait a long time for the computer to LOCATE the record! For example, if your data file contains 2,000 records, the LOCATE command takes about 25 times as long as the SEEK and FIND commands. The main reason for creating an index file is so that you can use the words SEEK and FIND. Since the index file makes the computer list all the names in alphabetical order, all the SAN names are listed near each other. So after you've found the first SAN (by saying FIND SAN and DISPLAY), you can display the next one immediately, by saying: . SKIP . DISPLAY Hassles If you QUIT or switch to a different data file, and later try to return to FAMILIES.DBF by saying USE FAMILIES, you must remind the computer to look at the index file. Instead of saying just USE FAMILIES, say: . USE FAMILIES INDEX FAMNAME If you accidentally forget to say INDEX FAMNAME, the computer will forget to look at the index. If you then APPEND or DELETE some records, the computer won't update the index, and the index will be wrong. If you get into that jam, get out of it by saying ___ . USE FAMILIES INDEX FAMNAME . REINDEX That makes the computer create the index all over again, correctly. To see the names of all your index files (such as FAMNAME.NDX), say: . DIR *.NDX  FOXPRO 2 To see the names of all your index files (such as FAMNAME.IDX), say ``DIR *.IDX''. PROGRAMS Let's write a program so that whenever you say DO STATS, the computer will automatically print the SUM and AVERAGE of all the numbers in your data file. Here's how. Begin by saying ___ . MODIFY COMMAND STATS That tells the computer you want to write a program called STATS.PRG. Next, say what you want STATS to stand for. If you want STATS to stand for ``the SUM followed by the AVERAGE'', type: SUM AVERAGE That pair of instructions (SUM and AVERAGE) is called the program. The computer does not put a dot prompt in front of the program lines. While you're typing the program, you can edit it by using the arrow keys and all the other word-processing keys (DELETE, INSERT, PAGE UP, and PAGE DOWN). To hop to the left margin, press the HOME key. To hop to the end of a line, press the END key. To delete a line, move to that line, then tap the Y key while holding down the CONTROL key. (The Y stands for ``Yank it out''.) To insert an extra line between two other lines, move to where you want the extra line to begin, then tap the N key while holding down the CONTROL key. (The N stands for ``iNsert New''.) When you've finished typing and editing the program, tap the END key while holding down the CONTROL key. That makes the computer put the entire program onto the disk. Then the screen will show a dot prompt. If you want the computer to DO the STATS program you typed, say: . DO STATS Then the computer will print the SUM and AVERAGE of all the numbers in the current data file. For example, if you've been using the FAMILIES data file, the computer will print the SUM of the INCOMEs, SUM of the POPULATIONs, AVERAGE of the INCOMEs, and AVERAGE of the POPULATIONs. (If you haven't been using a data file, the computer will ask you which file to USE. If your data file doesn't contain any Numeric fields, the computer will gripe.) If you ever want to revise that program, just say MODIFY COMMAND STATS again. The screen will show your program again and let you edit it. When you've finished editing it, tap the END key while holding down the CONTROL key. The new version of your program will be called STATS.PRG; the previous version of your program will still be on the disk but will be called STATS.BAK. For another example, let's program the computer so that when you say DO SUPERDIR, the computer will print a superdirectory. Let's make the superdirectory include a directory of all your data files, followed by a directory of all your index files, followed by a directory of all your program files. To make DO SUPERDIR accomplish all that, say: . MODIFY COMMAND SUPERDIR Then type this program ___ DIR DIR *.NDX DIR *.PRG End the program by tapping the END key while holding down the CONTROL key. From then on, whenever you say DO SUPERDIR, the computer will print a superdirectory. Into a program, you can put any DBASE commands you wish. For example, your program can include a USE command (to switch to a different data file), an APPEND command (to let the user add extra records to the file), and a BROWSE command (to let the user browse through the entire file and edit it). One of the lines in your program can even say DO a second program. When the computer encounters that line, the computer will DO the second program, then finish the original program. Your program's bottom line can even say QUIT, so that when the computer finishes the program it will stop using DBASE.  Old versions In DBASE 3 and 3+, here's how to hop to the left margin: tap the left-arrow key while holding down the CONTROL key. Here's how to hop to the end of the line: tap the right arrow key while holding down the CONTROL key.  FOXPRO 2 Saying ``MODIFY COMMAND STATS'' makes the computer create a window called ``STATS.PRG''. In that window, type your program, like this: SUM AVERAGE To insert an extra line, move to where you want the extra line to begin, then press ENTER. To delete a line, move to the beginning of that line, press SHIFT with down-arrow (so the line becomes brown), then press DELETE. When you've finished typing and editing the program, click the close box then click ``Yes''. In the SUPERDIR program, say ``DIR *.IDX'' instead of ``DIR *.NDX''. TEXT Let's program the computer so that whenever you say DO POEM, the computer will print this poem: YOUR DATA FILES ALL GIVE ME SMILES. I FEEL SO LOW, WHEN THEY MUST GO. PLEASE DON'T ERASE YOUR DATABASE! LOVE, YOUR COMPUTER Here's how: . MODIFY COMMAND POEM ? "YOUR DATA FILES" ? "ALL GIVE ME SMILES." ? "I FEEL SO LOW," ? "WHEN THEY MUST GO." ? "PLEASE DON'T ERASE" ? "YOUR DATABASE!" ? " LOVE," ? " YOUR COMPUTER" But typing all those question marks and quotation marks is ridiculous! For a short-cut, type this instead: . MODIFY COMMAND POEM TEXT YOUR DATA FILES ALL GIVE ME SMILES. I FEEL SO LOW, WHEN THEY MUST GO. PLEASE DON'T ERASE YOUR DATABASE! LOVE, YOUR COMPUTER ENDTEXT The words TEXT and ENDTEXT tell the computer that everything between them should be printed as strings. To begin an indented passage (such as LOVE and YOUR COMPUTER), press the TAB key. Pressing the TAB key makes the computer indent the current line and all lines underneath, until you tell the computer to stop indenting (by pressing SHIFT with TAB).  Old versions In DBASE 3 and 3+, pressing the TAB key makes the computer indent just 4 spaces (instead of 8). Pressing the TAB key makes the computer indent just the current line (not the lines underneath).  FOXPRO 2 Pressing the TAB key makes the computer indent just 4 spaces (instead of 8). To tell the computer to stop indenting, press the BACKSPACE key. Tricky output Here are some commands you can put in your program, to produce tricky output. To erase the screen, say: CLEAR If you say ___ ? "FAT" ?? "HER" the double question mark makes the computer print HER on the same line as FAT. The computer will print: FATHER When using DBASE, the screen's top line is called line 0. Then come lines 1, 2, etc. In each line, the leftmost character is at position 0. Then come positions 1, 2, etc. To print the word DROWN beginning at line 3's 7th position, type this: @3,7 SAY "DROWN" SET HEADING OFF When you say LIST, DISPLAY, SUM, or AVERAGE, the computer prints data in columns and puts a heading at the top of each column. If you want the computer to omit the headings, say: SET HEADING OFF That command remains in effect until you say SET HEADING ON (or QUIT). To invent your own customized heading, first get rid of the traditional headings (by saying SET HEADING OFF) and then print your own headings (by giving the ``?'' or ``@SAY'' commands). SET TALK OFF While running your program, the computer prints messages telling you which records and numbers it's manipulating. For example, if you say GO 3 and then SKIP 2, the computer prints a message saying it's skipping to record #5. If you say to COPY a file, the computer prints messages telling you how many records it's copied so far, until all the records are copied. Those messages help DBASE programmers but confuse business executives who don't understand the messages' jargon. To stop the computer from printing those messages, say: SET TALK OFF That command remains in effect until you say SET TALK ON. If you say SET TALK OFF, you'll have a hard time doing statistics: the simple COUNT, SUM, and AVERAGE commands don't work until you say SET TALK ON. Variables Like BASIC, DBASE lets you use variables easily. For example, if you say ___ X=7-1 ? X+3 the computer will print 9. (While the computer performs X=7-1, the computer will also print a little message saying that X is 6, unless you say SET TALK OFF.) A variable's name can be short (such as X) or longer. It can be up to 10 characters long (such as POPULATION). It can include underlines and digits (such as LOST_IN_86). It must begin with a letter. It cannot include blank spaces. A variable can stand for either a number or a string. For example, if you say ___ HUSBAND="TOM" ? HUSBAND the computer will print TOM. The computer handles two kinds of variables. A field variable stands for a field in a data file. For example, while you're using FAMILIES.DBF, you're using field variables called NAME, INCOME, and POPULATION. A memory variable is any variable that does not stand for a field. For example, if you say X=7-1, the X is a memory variable. Suppose you're using FAMILIES.DBF, so INCOME is a field variable. to change a family's INCOME to 20000, do not say INCOME=20000. Instead, say: REPLACE INCOME WITH 20000 Here's the rule: to change the value of a memory variable, say ``=''; to change the value of a field variable, say ``REPLACE''. The computer will remember all your variables until you say CLEAR MEMORY (which erases the memory variables) or say to USE a different data file (which affects the field variables) or say CLEAR ALL (which erases all the variables and also makes the computer forget which file you were USEing). The typical DBASE program begins by saying CLEAR ALL and ends by saying CLEAR ALL again, to make sure the variables from different programs don't interfere with each other. STORE Instead of saying X=7-1, you can say STORE 7-1 TO X. Saying ``STORE 7-1 TO X'' has exactly the same effect as saying ``X=7-1''. To make X, Y, and Z all be zero, say: STORE 0 TO X,Y,Z Statistics To make X be the SUM of all the INCOMEs in your data file, say: SUM INCOME TO X To make X be the SUM of all the INCOMEs and also make Y be the sum of all the POPULATIONs, say: SUM INCOME, POPULATION TO X,Y Similar commands work for COUNT and AVERAGE also. They all work even if you SET TALK OFF. INPUT Like BASIC, DBASE understands the word INPUT. If you say ___ INPUT "HOW OLD ARE YOU? " TO AGE the computer will ask ___ HOW OLD ARE YOU? and then wait for you to type a number. Whatever number you type will become the AGE. The INPUT statement's variable must be a memory variable, not a field variable. For example, if you're using FAMILIES.DBF and want the person to input an INCOME (which is a field variable), you must not say INPUT ``WHAT IS YOUR INCOME?'' TO INCOME. Instead, input a memory variable called MINCOME, then copy it to a field by saying REPLACE, like this: INPUT "WHAT IS YOUR INCOME? " TO MINCOME REPLACE INCOME WITH MINCOME ACCEPT To input a string instead of a number, say ACCEPT instead of INPUT: ACCEPT "WHAT IS YOUR FAVORITE FOOD? " TO FOOD Underneath that ACCEPT statement, you might want to add this line: FOOD=UPPER(FOOD) It makes the computer convert the human's input to capital (upper-case) letters, in case the human forgot to press the CAPS LOCK key. Like the INPUT statement, the ACCEPT statement takes a memory variable but not a field variable. WAIT This example says WAIT instead of ACCEPT: WAIT "WHAT'S YOUR MIDDLE INITIAL? " TO INITIAL ? "CONGRATULATIONS!" ? "ACCORDING TO ASTROLOGY, THE FORCES OF THE UNIVERSE" ? "SHALL CAUSE WONDROUS JOYS TO BEFALL" ? "THOSE LUCKY PERSONS WHOSE EARTH-GIVEN NAMES ARE CENTERED" ? "AROUND THE LETTER",INITIAL WAIT resembles ACCEPT. In that program, the first line makes the computer ask ``WHAT'S YOUR MIDDLE INITIAL?'' then wait for you to type a character. Whatever character you type will become the INITIAL. For example, if you type a Q, the Q will become the INITIAL. If the line had said ACCEPT, the computer would have required you to press the ENTER key after the Q. But since the line said WAIT instead of ACCEPT, you do not have to press ENTER: as soon as you type the Q, the computer will know Q is the INITIAL (without waiting for ENTER) and will make the screen show this: WHAT'S YOUR MIDDLE INITIAL? Q CONGRATULATIONS! ACCORDING TO ASTROLOGY, THE FORCES OF THE UNIVERSE SHALL CAUSE WONDROUS JOYS TO BEFALL THOSE LUCKY PERSONS WHOSE EARTH-GIVEN NAMES ARE CENTERED AROUND THE LETTER Q WAIT is nicer than ACCEPT, because WAIT doesn't force you to press the ENTER key after answering the question. But alas, WAIT restricts you to typing just one character: you can use WAIT for a middle initial, but not for a whole name. GET Suppose you live in San Francisco with most of your friends, but a few of your friends live elsewhere. Run this program: CLEAR ALL CLEAR SET TALK OFF CITY="SAN FRANCISCO" STATE="CA" @10,25 SAY "WHAT IS YOUR CITY?" GET CITY @11,25 SAY "WHAT IS YOUR STATE?" GET STATE READ ? "I AM GLAD TO HEAR YOU LIVE IN THE KOOKY CITY OF",CITY ? "IN THE SEDUCTIVE STATE OF",STATE SET TALK ON CLEAR ALL Like most DBASE programs, that program begins by saying CLEAR ALL (to avoid interference from other programs), CLEAR (to erase the screen), and SET TALK OFF (to avoid excessive messages). The next pair of lines make CITY be ``SAN FRANCISCO'' and make STATE be ``CA''. The next pair of lines put this message in the middle of your screen: WHAT IS YOUR CITY? SAN FRANCISCO WHAT IS YOUR STATE? CA The READ statement lets you edit the data in the boxes, by using the arrow keys, ENTER key, and other word-processing keys. (If you want to erase an entire box, move to that box, then tap the Y key while holding down the CONTROL key.) You can edit the boxes however you like ___ for example, change SAN FRANCISCO to RENO, and change CA to NV ___ or do no editing at all, so that you still have SAN FRANCISCO and CA. When you've finished doing all the editing you wish, tap the END key while holding down the CONTROL key, or just move to the bottom box and tap the ENTER key. If you changed SAN FRANCISCO to RENO and changed CA to NV, the next two lines in the program will print this, at the bottom of the screen: I AM GLAD TO HEAR YOU LIVE IN THE KOOKY CITY OF RENO IN THE SEDUCTIVE STATE OF NV Like most DBASE programs, that program ends by putting the computer back to its normal state (SET TALK ON and CLEAR ALL). To use the word GET, you should put it in an @ SAY command. Underneath the @ SAY GET commands, say READ. If you forget to include the SAY ``WHAT IS YOUR CITY?'', and instead type just @10,25 GET CITY, the computer will omit the question but will still show the CITY box. If you forget to say READ, you'll still see boxes full of data, but you won't get a chance to edit what's in them. By using GET and READ, you can edit any kind of variable. The variable can be a number or a string; it can be a memory variable or a field variable. If it's a field variable, the computer automatically makes the box wide enough to hold the entire field; and when you edit the data in the box, the computer automatically updates your data file. (You do not have to say REPLACE.) If it's a memory variable instead, your program must include a statement such as CITY=``SAN FRANCISCO'', which tells the computer how wide to make the box. To make the box even wider, put extra spaces after SAN FRANCISCO, like this: CITY="SAN FRANCISCO " If the memory variable stands for a number instead of a string, the computer automatically makes the box wide enough to hold 10 digits before the decimal point ___ or even wider. CONTROL THE FLOW You can control the order in which the computer does your program's statements. Here's how. . . . IF Like BASIC and PASCAL, DBASE lets you use the words IF and ELSE. Write the IF statement like this: IF AGE<18 ? "MINOR" ? "YOUNG" ELSE ? "ADULT" ? "OLD" ENDIF Whenever you say IF, you must also say ENDIF. To indent the lines in between, tap the TAB key. (The indentation is optional.) Here's how to say, ``If the NAME begins with SAN and the INCOME is at least 50000'': IF NAME="SAN" .AND. INCOME>=50000 Remember to put periods around the word AND. For strings, the symbol ``='' means ``begins with'', unless you said SET EXACT ON. DO WHILE To create a loop, say DO WHILE. If you want the loop to be infinite, say DO WHILE .T., like this: DO WHILE .T. ? "CAT" ? "DOG" ENDDO The computer will print CAT and DOG repeatedly, like this: CAT DOG CAT DOG CAT DOG etc. To abort the program, tap the Esc key (which stands for ``Escape'') and then the C key (which stands for ``Cancel''). Any program that says DO WHILE must also say ENDDO. The computer will repeat all the lines between DO WHILE and ENDDO, to form a loop. This program makes the computer print all the numbers from 1 to 10 and then print ``WOW'': SET TALK OFF X=1 DO WHILE X<=10 ? X X=X+1 ENDDO ? "WOW" SET TALK ON The top line prevents the computer from printing excessive messages. The next line says X starts at 1. The lines between DO WHILE and ENDDO are done repeatedly, as long as X<=10. If X gets past 10, the computer refuses to do the loop again, and instead proceeds to the line underneath ENDDO, which makes the computer say WOW. The bottom of the program says SET TALK ON, to put the computer back to normal. Altogether, the computer prints: 1 2 3 4 5 6 7 8 9 10 WOW In BASIC, you can create loops by giving commands such as ``GO TO 10'' and ``FOR I = 1 TO 10...NEXT''. Unfortunately, DBASE doesn't understand how to GO TO line 10 or how to do a FOR...NEXT loop. In DBASE, the only way to create a loop is to say DO WHILE...ENDDO. In the middle of a WHILE loop, you can put a line saying LOOP or EXIT. If the computer encounters a line saying LOOP, the computer loops back (by jumping back to the WHILE loop's top line). If the computer encounters a line saying EXIT, the computer exits from the loop (by jumping ahead to the line underneath ENDDO). RETURN Instead of using the BASIC word END, DBASE uses the word RETURN. While the computer is DOing your program, if the computer encounters a line that says RETURN, the computer will skip the rest of the program. The ULTIMATE program Congratulations! Now you know enough about DBASE so that you're ready to create the ULTIMATE program. This program lets you store and retrieve any information about any topic! Moreover, the program is so nicely designed that even a novice who knows nothing about DBASE can run the program and use its full power. How the program acts After you've written the program, you can start using it by just typing: . DO ULTIMATE Then the computer starts running the ULTIMATE program, which makes the computer ask: What topic interests you? (If unsure, type a question mark. To end, type an x.) If you type just an x or a capital X, the computer stops running the program and displays the dot prompt. If you type a question mark instead, the computer displays a list of all the topics it was fed previously. For example, those topics might include SHRUB, BUSH, QUAIL, BIRDBRAIN, MANHATTAN, SEX, THE MEANING OF LIFE, and STRANGE JOKES. Then the computer says: Pick one of those topics, or teach me a new one. What topic interests you? (If unsure, type a question mark. To end, type an x.) If you type anything other than an x or an X or a question mark, the computer searches through its file, to see whether it's been fed that topic. If it finds the topic in the file, it reveals all it knows about the topic, and then lets you edit that data. If it does not find the topic in the file, it says so, and gives you an opportunity to teach it about the topic. How to invent the program To make the computer do all that, so a novice can store and retrieve data easily, a professional (such as yourself!) must previously put three things onto the disk: the program itself (which is called ULTIMATE.PRG), a data file (called INFO.DBF), and an index file (called INFOTOP.NDX). Here's how. . . . Data file Start by putting the data file INFO.DBF onto the disk. To do that, say: . CREATE INFO Then complete this chart: ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄ¿ ³ Num ³ Field Name ³ Field Type ³ Width ³ Dec ³ Index ³ ÆÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍÍ͵ ³ 1 ³ TOPIC ³ Character ³ 25 ³ ³ N ³ ³ 2 ³ DATA ³ Character ³ 79 ³ ³ N ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÙ That allows each TOPIC to be 25 characters long, and the DATA about the topic to be 79 characters long. After typing the chart, tap the END key while holding down the CONTROL key. Then tap the ENTER key. The computer will ask, ``Input data records now?'' Tap the N key. Index file Next, put the index file INFOTOP.NDX onto the disk, by typing: . INDEX ON TOPIC TO INFOTOP That creates an index file called INFOTOP.NDX, which lets the computer find each TOPIC quickly. The program itself Finally, put the program ULTIMATE.PRG onto the disk. To do that, begin by saying: . MODIFY COMMAND ULTIMATE Then type the program's introduction: CLEAR ALL CLEAR SET TALK OFF SET HEADING OFF SET EXACT ON SET DELETED ON USE INFO INDEX INFOTOP That introduction says to CLEAR ALL influences from previous programs, CLEAR the screen, SET the DBASE program so you have complete control over everything, and USE the INFO data file INDEXed by INFOTOP. Then type the program's loop: DO WHILE .T. ? ?"What topic interests you? " ?? "(If unsure, type a question mark. To end, type an x.)" ACCEPT TO DESIRE DESIRE=UPPER(DESIRE) CLEAR DO CASE CASE DESIRE="X" EXIT CASE DESIRE="?" GO TOP IF EOF() ? "I don't know any topics yet. My mind is blank. " ?? "Please teach me a new topic." ELSE ? "I know about these topics:" DISPLAY ALL OFF TOPIC ? "Pick one of those topics, or teach me a new one." ENDIF CASE DESIRE="" OTHERWISE SEEK DESIRE IF FOUND() ? "Here's what I know about",DESIRE+":" @2,0 GET DATA ? "You can edit that info now." ? "(If you want me to forget about",DESIRE ?? ", tap Y while holding down the CTRL key.)" ? "When you're done, tap the ENTER key." READ CLEAR IF DATA="" DELETE ENDIF ELSE ? "I don't know anything about",DESIRE+"." ? "Tell me about",DESIRE+"." ? "(If you don't want to tell me, type an x.)" ACCEPT TO NEWDATA IF UPPER(NEWDATA)#"X" APPEND BLANK REPLACE TOPIC WITH DESIRE REPLACE DATA WITH NEWDATA ENDIF ENDIF ENDCASE ENDDO In that loop, each print statement uses small letters instead of capitals, so that the printing will look more sophisticated. (To create the small letters, just turn off the CAPS LOCK key, by tapping it.) After saying ACCEPT TO DESIRE, the next statement says DESIRE=UPPER(DESIRE), which converts the user's desired topic to capital letters. That saves the user from worrying about whether to type REAGAN or Reagan or reagan: whichever of those the user types, the computer will convert it to REAGAN. The DESIRE can be four kinds of things: it can be an X (which means the user wants to exit), a question mark (which means the user is confused and would like to see a list of topics), nothing at all (which means the user accidentally pressed the ENTER key an extra time), or a topic. The DO CASE statement tells the computer to handle those four cases: DESIRE=``X'', DESIRE=``'', and DESIRE=otherwise. Let's look at those four cases in more detail. In the CASE where DESIRE=``X'', the computer lets the user EXIT from the DO WHILE loop. In the CASE where DESIRE=``?'', the computer begins by checking whether the file contains any undeleted topics. Here's how. The lines GO TOP and IF EOF() tell the computer to GO to the TOP of the file and see if the TOP of the file is also the End Of the File. If the TOP of the file is also the End Of the File, the file doesn't contain any records yet (or all its records have been DELETED), so the computer will print ``I don't know any topics yet. My mind is blank.'' If the computer's mind is not blank, the computer will say ``I know about these topics'' and will DISPLAY ALL of the TOPICS. The computer will display the topics themselves but will not display their record numbers, since the DISPLAY statement says to turn the record numbers OFF. In the CASE where DESIRE=``'', the computer does nothing at all. In the case where desire is OTHERWISE, the computer will hunt through all the topics in the file, to SEEK the user's DESIRE. If the user's DESIRE is FOUND in the file, the computer is commanded to print ``Here's what I know about'',DESIRE+``:''. In that command, the word DESIRE is followed by a plus sign instead of a comma, to prevent the computer from leaving a blank space after DESIRE. If the user's DESIRE is not FOUND in the file, the computer is commanded to print ``I don't know anything about'',DESIRE+``.''. Then the computer asks the user to type some NEWDATA about the topic. If the user does indeed type some useful NEWDATA (instead of just an X), the computer appends the NEWDATA to the end of the file. To do that, the computer first APPENDs a BLANK record, then puts the NEWDATA into that record by using REPLACE. The remaining lines say ENDIF twice (to end the two IF statements) and ENDCASE (to end the DO CASE statement) and ENDDO (to end the DO WHILE statement). At the bottom of the program, add these lines: SET DELETED OFF COUNT FOR DELETED() TO DELCOUNT IF DELCOUNT>RECCOUNT()/4 ? "Please wait, " ?? "while I compress your data." PACK ? "The compression is done." ENDIF SET EXACT OFF SET HEADING ON SET TALK ON CLEAR ALL The computer reaches those lines when the user chooses to EXIT from the DO WHILE loop (by saying the DESIRE is ``X''). Those lines say to SET the computer back to normal and to CLEAR ALL interference from later programs. One of those lines says to PACK the file. But if fewer than a quarter of the records have been marked for deletion, the program tells the computer not to bother PACKing. Here's how the computer figures out whether to bother PACKing. The program says to COUNT how many records have been marked to be DELETED, and call that the DELCOUNT. The program says that IF the DELCOUNT is greater than the RECord COUNT divided by 4, then PACK. After you've typed that entire program, tap the END key while holding down the CONTROL key. Then you're done: you've created the ULTIMATE data-management program! Consequences Some parts of that program were hard to invent, but the program is super-easy to use. Try it! Then challenge yourself: think of further improvements to the ULTIMATE program, to make the program even easier to use and even more powerful! Such programs would be much harder to develop, if we were using BASIC, LOGO, PASCAL, C, COBOL or any other major computer language. That's why programmers love DBASE!  Old versions DBASE 3 doesn't understand RECCOUNT(); instead of saying IF DELCOUNT>RECCOUNT()/4, say COUNT TO RECCOUNT and then IF DELCOUNT>RECCOUNT/4. DBASE 3 doesn't understand the word FOUND. DBASE 3+ version 1.0 handles FOUND incorrectly if you deleted some records. For those versions of DBASE, instead of saying IF FOUND(), say IF .NOT. EOF().